"""
LED Matrix Clock - 主程序

这是一个基于RP2040的LED矩阵时钟项目的主程序。
实现了时间显示、日期显示和设置功能。

作者: Your Name
版本: 1.0.0
日期: 2024-03-xx
"""

# 导入必要的模块
from machine import Pin, I2C
import time
from ws2812 import WS2812Matrix
from rtc import DS1307
from encoder import RotaryEncoder
from numbers import DIGITS, CHARS

# 硬件配置
LED_PIN = 0          # WS2812数据线连接到GPIO0
MATRIX_WIDTH = 32    # LED矩阵宽度（4个8x8模块）
MATRIX_HEIGHT = 8    # LED矩阵高度
I2C_SCL = 17        # I2C时钟线
I2C_SDA = 16        # I2C数据线
ENCODER_CLK = 14    # 编码器时钟线
ENCODER_DT = 15     # 编码器数据线
ENCODER_SW = 13     # 编码器按键

# 月份颜色主题
MONTH_COLORS = [
    (255, 0, 0),    # 1月 红色
    (255, 128, 0),  # 2月 橙色
    (255, 255, 0),  # 3月 黄色
    (0, 255, 0),    # 4月 绿色
    (0, 255, 128),  # 5月 青绿
    (0, 255, 255),  # 6月 青色
    (0, 128, 255),  # 7月 浅蓝
    (0, 0, 255),    # 8月 蓝色
    (128, 0, 255),  # 9月 紫色
    (255, 0, 255),  # 10月 粉色
    (255, 0, 128),  # 11月 玫红
    (255, 128, 128) # 12月 粉红
]

# 星期颜色主题
WEEKDAY_COLORS = [
    (255, 0, 0),    # 周日 红色
    (255, 255, 0),  # 周一 黄色
    (0, 255, 0),    # 周二 绿色
    (0, 255, 255),  # 周三 青色
    (0, 0, 255),    # 周四 蓝色
    (255, 0, 255),  # 周五 紫色
    (255, 128, 0)   # 周六 橙色
]

# 星期显示字符
WEEKDAY_CHARS = ['S', 'M', 'T', 'W', 'T', 'F', 'S']

# 初始化设备
i2c = I2C(0, scl=Pin(I2C_SCL), sda=Pin(I2C_SDA))
rtc = DS1307(i2c)
led = WS2812Matrix(LED_PIN, MATRIX_WIDTH, MATRIX_HEIGHT)
encoder = RotaryEncoder(ENCODER_CLK, ENCODER_DT, ENCODER_SW)

# 全局状态变量
setting_mode = False
setting_index = 0  # 0:年 1:月 2:日 3:星期 4:时 5:分 6:秒
show_date = False
last_toggle_time = 0

def display_time_and_weekday():
    """显示时间和星期"""
    t = rtc.datetime()
    hour, minute, weekday = t[4], t[5], t[3]
    
    led.fill((0, 0, 0))
    
    # 显示小时（绿色）
    hour_tens = hour // 10
    hour_ones = hour % 10
    if hour_tens > 0:
        led.draw_digit(hour_tens, 0, 1, (0, 25, 0))
    led.draw_digit(hour_ones, 4, 1, (0, 25, 0))
    
    # 显示冒号（蓝色）
    led.draw_colon(10, 1, (0, 0, 25))
    
    # 显示分钟（红色）
    minute_tens = minute // 10
    minute_ones = minute % 10
    led.draw_digit(minute_tens, 14, 1, (25, 0, 0))
    led.draw_digit(minute_ones, 20, 1, (25, 0, 0))
    
    # 显示星期（使用对应的颜色）
    color = tuple(c // 10 for c in WEEKDAY_COLORS[weekday])
    led.draw_char(WEEKDAY_CHARS[weekday], 26, 1, color)
    
    led.show()

def display_date():
    """显示日期"""
    t = rtc.datetime()
    month, day = t[1], t[2]
    
    led.fill((0, 0, 0))
    
    # 显示月份（使用月份主题色）
    month_color = tuple(c // 10 for c in MONTH_COLORS[month - 1])
    month_tens = month // 10
    month_ones = month % 10
    if month_tens > 0:
        led.draw_digit(month_tens, 4, 1, month_color)
    led.draw_digit(month_ones, 10, 1, month_color)
    
    # 显示分隔符（蓝色）
    led.draw_char('-', 16, 1, (0, 0, 25))
    
    # 显示日期（白色）
    day_tens = day // 10
    day_ones = day % 10
    if day_tens > 0:
        led.draw_digit(day_tens, 20, 1, (25, 25, 25))
    led.draw_digit(day_ones, 26, 1, (25, 25, 25))
    
    led.show()

def display_setting(value, color=(25, 25, 0)):
    """显示设置值"""
    led.fill((0, 0, 0))
    
    tens = value // 10
    ones = value % 10
    if tens > 0:
        led.draw_digit(tens, 10, 1, color)
    led.draw_digit(ones, 16, 1, color)
    
    led.show()

def handle_setting_mode():
    """处理设置模式"""
    global setting_index
    t = list(rtc.datetime())
    
    rotation = encoder.read_rotation()
    if rotation != 0:
        # 根据setting_index调整对应的值
        if setting_index == 0:  # 年
            t[0] = (t[0] + rotation) % 100
        elif setting_index == 1:  # 月
            t[1] = max(1, min(12, t[1] + rotation))
        elif setting_index == 2:  # 日
            t[2] = max(1, min(31, t[2] + rotation))
        elif setting_index == 3:  # 星期
            t[3] = (t[3] + rotation) % 7
        elif setting_index == 4:  # 时
            t[4] = (t[4] + rotation) % 24
        elif setting_index == 5:  # 分
            t[5] = (t[5] + rotation) % 60
        elif setting_index == 6:  # 秒
            t[6] = (t[6] + rotation) % 60
        
        # 更新显示
        if setting_index == 1:  # 月
            display_setting(t[1], tuple(c // 10 for c in MONTH_COLORS[t[1]-1]))
        elif setting_index == 3:  # 星期
            display_setting(t[3], tuple(c // 10 for c in WEEKDAY_COLORS[t[3]]))
        else:
            display_setting(t[setting_index])
        
        # 更新RTC
        rtc.set_datetime(*t)

def main():
    global setting_mode, setting_index, show_date, last_toggle_time
    
    while True:
        button = encoder.check_button()
        
        if button == 2:  # 长按
            setting_mode = not setting_mode
            setting_index = 0
            if not setting_mode:
                show_date = False
        
        if setting_mode:
            if button == 1:  # 短按
                setting_index = (setting_index + 1) % 7
                t = rtc.datetime()
                if setting_index == 1:  # 月
                    display_setting(t[1], tuple(c // 10 for c in MONTH_COLORS[t[1]-1]))
                elif setting_index == 3:  # 星期
                    display_setting(t[3], tuple(c // 10 for c in WEEKDAY_COLORS[t[3]]))
                else:
                    display_setting(t[setting_index])
            handle_setting_mode()
        else:
            if button == 1 or encoder.read_rotation() != 0:  # 短按或旋转
                show_date = not show_date
                last_toggle_time = time.ticks_ms()
            
            current_time = time.ticks_ms()
            if show_date:
                if time.ticks_diff(current_time, last_toggle_time) > 3000:  # 3秒后返回时间显示
                    show_date = False
                display_date()
            else:
                display_time_and_weekday()
        
        time.sleep(0.1)

if __name__ == '__main__':
    main() 